#include "archivoIdTerminos.h"

archivoIdTerminos::archivoIdTerminos(string ruta) : indice(ruta) {
	this->listaTerminos.open(ruta.c_str(), fstream::in|fstream::out|fstream::binary);
	if(!this->listaTerminos.is_open())
	{
		this->listaTerminos.clear();
		this->listaTerminos.open(ruta.c_str(), fstream::out|fstream::binary);
		this->listaTerminos.seekp(0,fstream::beg);
		this->cantTerminos = 0;
		this->listaTerminos.write((char*) &(this->cantTerminos), sizeof(this->cantTerminos));
		this->listaTerminos.close();
		this->listaTerminos.clear();
		this->listaTerminos.open(ruta.c_str(), fstream::in|fstream::out|fstream::binary);
	}
	this->listaTerminos.seekg(0,fstream::beg);
	this->listaTerminos.read((char*) &(this->cantTerminos), sizeof(this->cantTerminos));
}

archivoIdTerminos::~archivoIdTerminos()
{
	this->listaTerminos.seekp(0,fstream::beg);
	this->listaTerminos.write((char*) &(this->cantTerminos), sizeof(this->cantTerminos));
}

int archivoIdTerminos::agregarTermino(long idTerm, string& term) {
	ClaveIdTermino clave;
	DatoOffset dato;
	long offset;
	unsigned longTerm;
	
	clave = idTerm;
	this->indice.readIgual(dato,clave);
	if(this->indice.eof()) {
		// el id no existe, escribimos el string en el archivo y agregamos el idterm al indice
		this->listaTerminos.seekp(0,fstream::end);
		offset = listaTerminos.tellg();
		longTerm = term.length() + 1;
		this->listaTerminos.write((char*) &longTerm, sizeof(longTerm));
		this->listaTerminos.write((char*) term.c_str(), longTerm);
		dato = offset;
		this->indice.insert(clave, dato);
		this->cantTerminos++;
	}
	else
		return -1;
	
	return 0;
}

string archivoIdTerminos::obtenerTermino(long idTerm) {
	ClaveIdTermino clave;
	DatoOffset dato;
	long offset;
	unsigned longitud;
	char* termino;
	string stermino;		
		
	clave = idTerm;
	indice.readIgual(dato, clave);
	if (!indice.eof())
		offset = dato.getOffset();
	 else {
		//no encontrado
		stermino = "";
		return stermino;
	}
	
	this->listaTerminos.seekg(offset);
	this->listaTerminos.read((char*) &longitud, sizeof(longitud));
	termino = new char[longitud];
	this->listaTerminos.read((char*) termino, longitud);
	stermino = termino;
	delete[] termino;
	
	return stermino;

}